package org.dicr.util.jds;

import java.io.*;
import java.util.*;

import com.borland.dx.dataset.*;

/***********************************************************************************************************************
 * @author Igor A Tarasov me@dicr.dn.ua
 * @version 030128
 **********************************************************************************************************************/
public class DataUtils {

	/*******************************************************************************************************************
     * Преобразование типа OBJECT в INPUTSTREAM
     * 
     * @param from
     * @param to
     * @throws IOException
     ******************************************************************************************************************/
	public static void objectToInputStream(Variant from, Variant to) throws IOException {
		if (!from.isNull()) {
			ByteArrayOutputStream baos = new ByteArrayOutputStream(50000);
			ObjectOutputStream oos = new ObjectOutputStream(baos);
			oos.writeObject(from.getObject());
			oos.flush();
			oos.close();
			baos.flush();
			byte[] b = baos.toByteArray();
			ByteArrayInputStream bin = new ByteArrayInputStream(b);
			bin.mark(b.length);
			to.setInputStream(bin);
		} else {
			to.setNull(Variant.ASSIGNED_NULL);
		}
	}

	/*******************************************************************************************************************
     * Преобразование типа INPUTSTREAM в OBJECT
     * 
     * @param from
     * @param to
     * @throws IOException
     * @throws ClassNotFoundException
     ******************************************************************************************************************/
	public static void inputStreamToObject(Variant from, Variant to) throws IOException, ClassNotFoundException {
		Object obj = null;
		if (!from.isNull()) {
			InputStream in = from.getInputStream();
			if (in != null && in.available() > 0) {
				in.reset();
				ObjectInputStream ois = new ObjectInputStream(in);
				obj = ois.readObject();
			}
		}
		if (obj != null) to.setObject(obj);
		else to.setNull(Variant.ASSIGNED_NULL);
	}

	/*******************************************************************************************************************
     * Возвращает список уникальных значений столбца dataset
     * 
     * @param dataset источник данных
     * @param columnName колонка данных
     * @return список уникальных значений в колонке
     ******************************************************************************************************************/
	public static Vector<Object> getUniqColumnValues(DataSet dataset, String columnName) {
		Vector<Object> values = new Vector<Object>();
		if (dataset != null && dataset.isOpen() && columnName != null && dataset.hasColumn(columnName) != null) {
			try {
				dataset.enableDataSetEvents(false);
				DataRow row = new DataRow(dataset, columnName);
				Variant v = new Variant();
				for (int i = 0; i < dataset.getRowCount(); i++) {
					dataset.getDataRow(i, row);
					row.getVariant(columnName, v);
					Object value = v.getAsObject();
					if (!values.contains(value)) values.add(value);
				}
			} finally {
				dataset.enableDataSetEvents(true);
			}
		}
		return values;
	}

	/*******************************************************************************************************************
     * Определяет признак модифицирования данных в DataSet
     * 
     * @param ds
     * @return .
     ******************************************************************************************************************/
	public static boolean isModified(DataSet ds) {
		if (ds == null || !ds.isOpen()) { return false; }
		return (ds.isEditing() || ds.getStorageDataSet().changesPending());
	}

	/*******************************************************************************************************************
     * Проверяет на определенность значений в MasterLink. Используется компонентами для запрещения редактирования
     * DataSet в случае, если MasterLink DataSet в связующих колонках имеет неопределенные значения.
     * 
     * @param dataset
     * @return .
     * @throws DataSetException
     ******************************************************************************************************************/
	public static boolean isMasterDataComplete(DataSet dataset) throws DataSetException {
		MasterLinkDescriptor masterDesc = dataset.getMasterLink();
		if (masterDesc == null) return true;
		DataSet masterData = masterDesc.getMasterDataSet();
		if (!masterData.isOpen() || masterData.isEditingNewRow()) return false;
		String masterCols[] = masterDesc.getMasterLinkColumns();
		for (int i = 0; i < masterCols.length; i++) {
			if (masterData.isNull(masterCols[i])) return false;
		}
		return true;
	}

	/*******************************************************************************************************************
     * Проверяет редактируемость источника данных
     * 
     * @param dataset
     * @return .
     ******************************************************************************************************************/
	public static boolean isDataSetEditable(DataSet dataset) {
		if (dataset == null) return false;
		if (!dataset.isEditable()) return false;
		if (!dataset.isOpen()) return false;
		StorageDataSet stor = dataset.getStorageDataSet();
		if (stor != null && stor.isReadOnly()) return false;
		return isMasterDataComplete(dataset);
	}
}
